// 数组运算

#include <stdio.h>

/*
找出 key 在数组 a 中的位置
@param key 要寻找的数字
@param a 要寻找的数组
@param length 数组 a 的长度
@return 如果找到，返回其在 a 中的位置；如果找不到则返回-1
*/
int search(int key, int a[], int length);

int main(int argc, char const *argv[])
{
    // 数组的集成初始化，不用给出数组大小
    // 在最后加一个逗号是一种古老的传统，方便再加元素
    // 不能用数组给数组赋值，比如int b[] = a; 想赋值就遍历
    int a[] = {2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 32,};
    {
        int i;
        for (i = 0; i < 13; i++)
        {
            printf("%d\t", a[i]);
        }
        printf("\n");
    }

    // 如果只写一个值和数组大小，则值会被赋给第0个元素，后面全部为0
    // 可以用于初始化数组，例如array[10] = {0};
    // 要加大括号！
    int b[10] = {6};
    {
        for (int i = 0; i < 10; i++)
        {
            printf("%d\t", b[i]);
        }
        printf("\n");
    }

    // 集成初始化时的定位
    // C99以后才能用
    // 也可以c[] = {...}，数组大小会根据后面最大的序号设置
    // 适合比较稀疏的数组，多个0，只有几个非0
    int c[10] = {
        [0] = 2, [2] = 3, 6,
    };
    {
        for (int i = 0; i < 10; i++)
        {
            printf("%d\t", c[i]);
        }
        printf("\n");
    }

    // sizeof()函数：变量占多少字节
    printf("%d\n", sizeof(a));
    // 想要获得数组的长度，就用数组大小除以数组中一个元素的大小
    // 这样当修改数组后就不用在用到数组长度的地方做出修改
    printf("%d\n", sizeof(a) / sizeof(a[0]));


    loc = search(1, a, sizeof(a) / sizeof(a[0]));
    
    return 0;
}

// 当数组作为函数的参数时：
// 不能给出数组的大小
// 不能使用sizeof的方法计算数组大小
int search(int key, int a[], int length)
{
    int ret = -1;
    int i;
    for (i = 0; i < length; i++)
    {
        if (a[i] == key)
        {
            ret = key;
            break;
        }
    }
    return ret;
}